package part1.chapter5_refactoring;

/**
 * Created by lie on 2018/3/8.
 * 优化循环次数
 * 备注：这里使用继承是为了去除重复的信息，让重构的部分更明显；
 * 实际重构不用非得继承
 */
public class PrimeGenerator2 extends PrimeGenerator1{

    //按照思路列个方法
    public static int[] getPrimes(int maxValue){
        if (maxValue <= 2) {
            return new int[0];
        }else {
            //1 初始化
            init(maxValue);
            //2 排除掉非素数
            filtration();
            //3 返回
            putIsCrossedIntoResults();
            return result;
        }
    }


    private static void filtration() {

        //4、所以我们对这里的i的结束条件进行优化
        for (int i=2;i< Math.sqrt(isCrossed.length);i++){
            if (isCrossed[i]){

                for (int multiple = i; multiple*i < isCrossed.length;multiple++){
                    //1、很容易就注意到这里的循环结束条件：multiple*i < isCrossed.length；下面来逐步拆解：

                    //2、我们考虑一种极限情况：i很大，直接变成 isCrossed.length-1这种最大值
                        //那我们知道，(isCrossed.length-1)(isCrossed.length-1) 必然是大于 isCrossed.length的
                        //所以这里的内循环，其实是不必进来的
                    //3、那到底i大于多少，会让这里的内循环不必要呢？
                        //很明显，就是刚好是 isCrossed.length 的平方根了

                    isCrossed[i * multiple] = false;
                }
            }
        }

    }

}
